# Table of Contents

# Filter

필터(Filter)를 사용하면 클라이언트의 요청을 서블릿에서 처리하기 전에 필터링할 수 있다. 필터는 다음과 같은 용도로 활용할 수 있다.

  • 사용자 인증 필터
  • 로깅 또는 감시 필터
  • 이미지 변환 및 압축
  • 데이터 변화

필터는 Filter인터페이스를 구현하고 세 가지 메소드를 구현해야한다.

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;

public class MyFilter implements Filter {

    public MyFilter() {
        //..
    }

    public void init(FilterConfig filterConfig) throws ServletException {
        //..
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //..
    }

    public void destroy() {
        //..
    }

}

# init()

Filter가 처음 생성될 때만 한 번 호출된다.

# destroy()

Filter가 소멸될 때 한 번 호출된다.

# doFilter()

이 메소드에서 Client의 Request를 필터링한다.

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    // ...
}

이 함수의 세 번째 인자로 FilterChain 객체가 전달된다. 여러 개의 필터가 설정된 경우 FilterChain클래스의 doFilter()를 호출해야 다음 필터로 넘어간다.

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    // (1) 전처리 코드
    chain.doFilter(request, response);
    // (2) 후처리 코드
}

# Filter 등록

Filter는 두 가지 방법으로 등록할 수 있다.

# @WebFilter 어노테이션

@WebFilter을 사용하면 된다. 이때 필터링할 경로를 함께 전달한다. 모든 경로에 대한 요청을 필터링하려면 /*을 전달하면 된다.



 




















package com.yologger.app;

@WebFilter("/*")
public class MyFilter implements Filter {

    public MyFilter() {
        //..
    }

    public void init(FilterConfig fConfig) throws ServletException {
        //..
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //..
    }

    public void destroy() {
        //..
    }

}

# web.xml에 등록

web.xml에 필터를 등록할 수도 있다.

package com.yologger.app;

public class MyFilter implements Filter {

    // ..

}



 
 
 
 
 
 
 
 



<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">

    <filter>
        <filter-name>MyFilter</filter-name>
        <filter-class>com.yologger.app.MyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>MyFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app> 

# 예제

이제 예제를 살펴보자.

@WebServlet("/Controller")
public class Controller extends HttpServlet {
       
    public Controller() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet()");
        response.getWriter().append("/Controller");
    }
}
@WebFilter("/*")
public class MyFilter implements Filter {

    public MyFilter() {
    }

    public void init(FilterConfig fConfig) throws ServletException {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("Before doFilter()");
        chain.doFilter(request, response);
        System.out.println("After doFilter()");
    }

    public void destroy() {
    }
}

이제 웹 브라우저에서 http://localhost:8000/project/Controller로 접속하면 다음과 같이 출력된다.

Before doFilter()
doGet()
After doFilter()